package 算法练习;/**
 * @author： li
 * @date： 2022-01-19 19:25
 * @version 1.0
 */

/* 小蓝有一个超大的仓库，可以摆放很多货物。
​ 现在，小蓝有 n 箱货物要摆放在仓库，每箱货物都是规则的正方体。小蓝
规定了长、宽、高三个互相垂直的方向，每箱货物的边都必须严格平行于长、
宽、高。
​ 小蓝希望所有的货物最终摆成一个大的立方体。即在长、宽、高的方向上
分别堆 L、W、H 的货物，满足 n = L × W × H。
​ 给定 n，请问有多少种堆放货物的方案满足要求。
​ 例如，当 n = 4 时，有以下 6 种方案：1×1×4、1×2×2、1×4×1、2×1×2、2 × 2 × 1、4 × 1 × 1。
​ 请问，当 n = 2021041820210418 （注意有 16 位数字）时，总共有多少种方案？
最后解法还是挺简单的，就是遍历这个大数的所有因数，然后对这些因数进行全排序，找到所有三个相乘为大数的排序
 */
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

public class 货物摆放 {
    static Deque<Long> temp = new LinkedList<>();
    static List<Long> yn = new ArrayList<>();
    static long count = 0;
    static long n = 2021041820210418L;

    public static void main(String[] args) {
        for (long i = 1, end = (long) Math.sqrt(n); i <= end; i++) {
            if (n % i == 0) {
                yn.add(i);
                yn.add(n / i);
            }
        }

        // 去重
        yn = yn.stream().distinct().collect(Collectors.toList());
        dfs(0, 1);

        System.out.println(count);
    }

    static void dfs(int be, long now) {
        if (temp.size() == 3) {
            if (now == n) {
                count++;
            }
            return;
        }

        for (int i = be; i < yn.size(); i++) {
            temp.addLast(yn.get(i));
            dfs(be, now * yn.get(i));
            temp.removeLast();
        }
    }
}
